#ifndef MYPAINT3D_H
#define MYPAINT3D_H
#include <QWidget>
#include <GL/glu.h>
#include <QtOpenGL>
#include <QOpenGLWidget>
#include <QOpenGLFunctions_4_5_Core>
#include <QGridLayout>
#include "paintdata.h"
#include "painttool.h"

//颜色模式
enum LineType{
    COLOR_DEFULT = 0,
    COLOR_SELECTOR = 1, //颜色选择器
    COLOR_RANDOM = 2,  // 不同值不同颜色随机
};

enum DrawType {
    DrawVertical = 0, //垂直于xz轴画线模式
    DrawLine = 1, //连线模型
    DrawPoints = 2, //点模式
};

class MyPaint3D : public QOpenGLWidget, public QOpenGLFunctions_4_5_Core
{
    Q_OBJECT
public:
    explicit MyPaint3D(QWidget *parent = nullptr);
    virtual ~MyPaint3D();
    /**
     * @brief setData 将数组放到缓存
     * @param data 一维数组, 数量initBuffer函数的waveNum
     */
    virtual void setData(float* data);
    /**
     * @brief setSomeData 设置部分数据，从0开始到num
     * @param data 一维数组
     * @param num 值必须小于initBuffer函数初始化的waveNum值, 大于waveNum直接剪裁
     */
    virtual void setSomeData(float* data, int num);
    /**
     * @brief initBuffer 初始化缓存数据，必须调用
     * @param waveNum  波的数量
     * @param periodNum 可承载的时间最大数量
     * @param yVal  y轴最大值，振幅最大值
     */
    virtual MyPaint3D* initBuffer(int waveNum, int periodNum, float yVal);
    /**
    * @brief 设置振幅
    * @param size y轴长度
    */
    MyPaint3D* setY(float size);
    /**
     * @brief setX 设置x轴，时间轴
     * @param size x轴长度
     */
    MyPaint3D* setX(float size);
    /**
     * @brief setZ 设置z轴
     * @param size z轴长度
     */
    MyPaint3D* setZ(float size);
    /**
     * @brief setColorType  设置绘图的颜色模式：选择器模式，渐变色，纯色
     * @param t  类型，枚举
     * @return
     */
    MyPaint3D* setColorType(LineType t);
    /**
     * @brief setDrawType 设置绘制的模式：垂直于时间和波的面，点模式，波的多边形连线
     * @param t 类型，枚举
     * @return
     */
    MyPaint3D* setDrawType(DrawType t);
    /**
     * @brief setColorMax  渐变色模式下，设置渐变的最大值
     * @param max  最大值
     * @return
     */
    MyPaint3D* setColorMax(float max);
    /**
     * @brief setColorSelector 选择器模式，设置不同值的范围内的不同颜色
     * @param min 最小
     * @param max 最大
     * @param r
     * @param g
     * @param b
     * @return
     */
    MyPaint3D* setColorSelector(float min, float max, byte r, byte g, byte b);
    /**
     * @brief setGridNum  设置网格数量，横纵的个数
     * @param xyHGridNum  xy面，横向的个数
     * @param xyVGridNum  xy面，纵向的个数
     * @param yzHGridNum  yz面，横向的个数
     * @param yzVGridNum  yz面，纵向的个数
     * @return
     */
    MyPaint3D* setGridNum(int xyHGridNum, int xyVGridNum, int yzHGridNum, int yzVGridNum);
    /**
     * @brief setXText  设置x轴说明
     * @param name  x轴名称
     * @param font  字体
     * @param color  颜色
     * @return
     */
    MyPaint3D* setXText(QString name, QFont& font, QColor color);
    MyPaint3D* setYText(QString name, QFont& font, QColor color);
    MyPaint3D* setZText(QString name, QFont& font, QColor color);
    /**
     * @brief setXText  通过png图像设置x轴
     * @param filePath  图像路径
     * @return
     */
    MyPaint3D* setXText(QString filePath);
    MyPaint3D* setYText(QString filePath);
    MyPaint3D* setZText(QString filePath);
    /**
     * @brief setBackground  设置背景颜色
     * @param color
     * @return
     */
    MyPaint3D* setBackground(QColor color);

    MyPaint3D* setRotate(int xAngel,int yAngel,int zAngel);

public:
    int timeInterval;
protected:
    //视角
    Point3d m_Rotate;
    // 深度
    int m_scloe;
    Point3d m_Size;
    Point3d m_valScole;
    // 三维坐标系位移参数
    Point3d m_translate;
    // 鼠标按下坐标参数
    Point3d m_press;
    // 窗口位移参数
    Point3d m_rot1;
    Point3d m_rot2;

    long m_time; //时间刻度
    CData** m_datas;
    int waveNum;
    int maxPeriod;
    float yMax;
    float m_colorScole;
    CColorSelector m_colorSelector;
    DrawType m_drawType;
    LineType colorType;
    int m_xyGridNum[2];
    int m_yzGridNum[2];
    QColor m_bgColor;
protected:
    /**
     * @brief paintGrid 绘制网格
     * @param start  起始位置
     * @param end  终止位置
     * @param num  数量
     */
    virtual void paintGrid(Point3d start, Point3d end, int num);
    virtual void paintXYGrid(int hNum, int vNum);
    virtual void paintYZGrid(int hNum, int vNum);
    virtual void paintXYZText();
    //绘制数据点
    virtual void paintData();
    //绘制坐标轴
    virtual void painAxis();
    //绘制坐标轴刻度
    virtual void painTicks(int num, Axis type);
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
    virtual void mousePressEvent(QMouseEvent *event);
    virtual void mouseReleaseEvent(QMouseEvent *event);
    virtual void mouseMoveEvent(QMouseEvent *event);
    virtual void wheelEvent(QWheelEvent *event);
private:
    CPaint2DTextTool* m_txtTool;
private:
    void setDataToObj(float* data, int begin, int end);
signals:
};



#endif // MYPAINT3D_H
